﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.XPath;

namespace Server
{
    class ParseXml
    {
        // Search a value by the node id
        public static bool SearchValueById (int id)
        {
            /* On déclare et on crée une instance des variables nécéssaires pour la recherche */
            XPathDocument XPathDocu = new XPathDocument(@"C:\Users\Nali\Desktop\users.xml"); 
            XPathNavigator Navigator;
            XPathNodeIterator Nodes;

            // On crée un navigateur 
            Navigator = XPathDocu.CreateNavigator();

            // On crée ici l'expression XPath de recherche de client à  partir de L'ID 
            String ExpXPath = "//User[@id="+id+"]";

            // On lance la recherche 
            Nodes = Navigator.Select(Navigator.Compile(ExpXPath));

            // On vérifie si la recherche a été fructueuse 
            if (Nodes.Count != 0)
            {
                Nodes.MoveNext(); // NOTE: Necéssaire pour se placer sur le noeud recherché
              
                /* 
                 Encodage des données dans la classe Customer Pas besoin de chercher cette donnée vu que c'est notre 
                 critère de recherche, on peut donc directement l'encoder. 
                */

                Nodes.Current.MoveToFirstChild(); 
                // On se déplace sur le premier noeud enfant "Prenom" 
                String FirstName = Nodes.Current.Value;
                Nodes.Current.MoveToNext(); // On se déplace sur le noeud suivant "Nom"
                String Name = Nodes.Current.Value;
                Nodes.Current.MoveToNext();
                String PhoneNumber = Nodes.Current.Value;
                Nodes.Current.MoveToNext();
                String RegistrationDate = Nodes.Current.Value;

                Console.WriteLine("RESULTAT : " + FirstName + " " + Name + " " + PhoneNumber + " " + RegistrationDate);
                return true;
            }   
            else
            {
                return false;
            }
        }


        // Display the parent node
        // To test : ParseXml.SearchByNode("Prenom", "TEST");
        public static String SearchByNode(string Criteria, string Node)
        {
            String result = "";

            XPathDocument XPathDocu = new XPathDocument(@"C:\Users\Nali\Desktop\users.xml");
            XPathNavigator Navigator;
            XPathNodeIterator Nodes;
 
            Navigator = XPathDocu.CreateNavigator();

            String ExpXPath = "Users/User[" + Criteria + "='" + Node + "']";

            Nodes = Navigator.Select(Navigator.Compile(ExpXPath));
           
            if (Nodes.Count != 0)
            {
                Nodes.MoveNext();

                String ID = Nodes.Current.GetAttribute("id", "");
                Nodes.Current.MoveToFirstChild();

                String FirstName = Nodes.Current.Value;
                Nodes.Current.MoveToNext();

                String Name = Nodes.Current.Value;
                Nodes.Current.MoveToNext();

                String PhoneNumber = Nodes.Current.Value;
                Nodes.Current.MoveToNext();

                String RegistrationDate = Nodes.Current.Value;

                return result = "RESULTAT : " + ID + " " + FirstName + " " + Name + "  " + PhoneNumber + " " + RegistrationDate;
            }
            else
            {
                return result = "Any result";
            }
        }


        // Modification of the XML File
        public static Boolean EditXMLData()
        {
            /* On utilise un XmlDocument et non un XPathDocument car 
               ce dernier ne permet pas l'édition des données XML. */
            XmlDocument XmlDoc = new XmlDocument();
            XPathNavigator Navigator;
            XPathNodeIterator Nodes;

            XmlDoc.Load(@"C:\Users\Nali\Desktop\users.xml");
            Navigator = XmlDoc.CreateNavigator();
            
            String ExpXPath = "//User[@id=3]";
            Nodes = Navigator.Select(Navigator.Compile(ExpXPath));
             
            if (Nodes.Count != 0)
            {
                /* Encodage des nouvelles données */
                Nodes.MoveNext();
                Nodes.Current.MoveToFirstChild();
                Nodes.Current.SetValue("TEST");
                Nodes.Current.MoveToNext(XPathNodeType.Element);
             
                XmlDoc.Save(@"C:\Users\Nali\Desktop\users.xml");
                return true;
            }
            else
            {
                return false;
            }
        }

        
        public static Boolean InsertNewData(String sFirstName, String sName, String sPhoneNumber, String sRegistrationDate)
        {
            String FirstName = sFirstName;
            String Name = sName;
            String PhoneNumber = sPhoneNumber;
            String RegistrationDate = sRegistrationDate;

            XmlDocument XmlDoc = new XmlDocument();
            XPathNavigator Navigator;
            XPathNodeIterator Nodes;
            Int32 ID; // Variable utilisée pour savoir quel est l'ID qu'il faut affecter au nouveau noeud créé 
           
            XmlDoc.Load(@"C:\Users\Nali\Desktop\users.xml");
            Navigator = XmlDoc.CreateNavigator();

            // get the MaxID in the file 
            String ExpXPath = "//MaxID";

            Nodes = Navigator.Select(Navigator.Compile(ExpXPath));
            Nodes.MoveNext();

            // Place the maxID in the variable ID
            ID = Nodes.Current.ValueAsInt;

            // Raise the value of the node MaxID because a new node was created
            Nodes.Current.SetValue((ID + 1).ToString());
            
            // On se place sur le noeud ayant l'ID le plus élevé 
            String ExpXPath2 = "//User[@id='" + ID.ToString() + "']";
            Console.WriteLine(ExpXPath2);
            Nodes = Navigator.Select(Navigator.Compile(ExpXPath2));
           
            if (Nodes.Count != 0)
            {
                Nodes.MoveNext();
                /* On crée le noeud principal  */
                Nodes.Current.InsertElementAfter("", "User", "", "");
                /* On se place sur le noeud ainsi créé. */
                Nodes.Current.MoveToNext(XPathNodeType.Element);
                ID++; /* On incrémente ID pour que sa valeur soit identique à celle se
                       * trouvant dans le noeud MaxID. */
                      /* Encodage des données */
                Nodes.Current.CreateAttribute("", "id", "", ID.ToString());

                Nodes.Current.AppendChildElement("", "Prenom", "", FirstName);
                Nodes.Current.AppendChildElement("", "Nom", "", Name);
                Nodes.Current.AppendChildElement("", "Telephone", "", PhoneNumber);
                Nodes.Current.AppendChildElement("", "DateInscription", "", RegistrationDate);
                Nodes.Current.AppendChildElement("", "Status", "", "Activated");

                XmlDoc.Save(@"C:\Users\Nali\Desktop\users.xml");
                
                return true;
            }
            else
            {
                return false;
            }
        }
        
    }
}
